package edu.zzuli.model.core;

import java.util.Collections;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;

import edu.zzuli.common.Pagination;

/**
 * @author tianshaojie
 * @date 2011-7-16
 * @discription : jqGrid分页封装类
 * 根据jsonReader中的设置，解析json数据。
 * 根据jsonReader中的root（我设置的是“gridModel”），得到数据记录数组；
 * 根据rows得到每页显示的行数；根据page设置当前页数；
 * 根据records（我设置的是“record”）得到所有记录数量；
 * 根据total得到所有页数。
 */
@SuppressWarnings("serial")
public abstract class JqGridBaseAction<T> extends ActionSupport {
	
	private Integer rows = 0;		//每页行数（从前台自动获取）pageSize
	
	private Integer page = 0;		//当前页号（从前台自动获取）currentPage
	
	private Integer total = 0;		//总页数	totalPages
	
	private Integer record = 0;		//总数据条数	totalRows
	
	private String sord;			//排序的方式
	
	private String sidx;			//用于排序的列名
	
	private String search;			//用于查询的请
	
	private List<T> gridModel;		//用于得到返回客户端的实际json数据

	/**
	 * @author tianshaojie
	 * @date 2011-7-16
	 * @discription : 抽象方法，继承子类实现，获得记录总条数（old）
	 * @return int
	 */
	//public abstract int getResultSize();

	/**
	 * @author tianshaojie
	 * @date 2011-7-16
	 * @discription : 获得当分页数据（old）
	 * @param from	：开始位置		rows * (page - 1)
	 * @param length：每页数据条数	length = rows
	 * @return List<T>
	 */
	//public abstract List<T> listResults(int from, int length);

	/**
	 * @author tianshaojie
	 * @date 2011-7-16
	 * @discription : 通过Pagination获得结果集（这样查询总条数和结果集放在一个操作里面即可获得，减少数据库访问连接）
	 * @param pagination
	 * @return List<T>
	 */
	public abstract List<T> listResults(Pagination pagination);
	
	/**
	 * @author tianshaojie
	 * @date 2011-3-27
	 * @discription : 为gridModel、record、total赋值，这些值也将会传回客户端。
	 * @return String
	 */
	public String refreshGridModel() {
		try {
			List<T> results = Collections.emptyList();
			
			/*record = this.getResultSize();
			int from = rows * (page - 1);
			int length = rows;
			results = this.listResults(from, length);
			this.setGridModel(results);*/
			
			if (rows > 0 && page > 0) {
				Pagination pagination = new Pagination(rows, page);
				results = this.listResults(pagination);
				record = pagination.getTotalRows();	//总记录条数
				this.setGridModel(results);
			}
//			if (results != null && results.size() > 0) {
//				this.setGridModel(results);
//			}
			
			total = (int) Math.ceil((double) record / (double) rows);//总页数
			return SUCCESS;
		} catch (Exception e) {
			e.printStackTrace();
			this.addActionError(e.getMessage());
			return ERROR;
		}
	}

	public List<T> getGridModel() {
		return gridModel;
	}

	public void setGridModel(List<T> gridModel) {
		this.gridModel = gridModel;
	}

	public Integer getRows() {
		return rows;
	}

	public void setRows(Integer rows) {
		this.rows = rows;
	}

	public Integer getPage() {
		return page;
	}

	public void setPage(Integer page) {
		this.page = page;
	}

	public Integer getTotal() {
		return total;
	}

	public void setTotal(Integer total) {
		this.total = total;
	}

	public Integer getRecord() {
		return record;
	}

	public void setRecord(Integer record) {
		this.record = record;
	}

	public String getSord() {
		return sord;
	}

	public void setSord(String sord) {
		this.sord = sord;
	}

	public String getSidx() {
		return sidx;
	}

	public void setSidx(String sidx) {
		this.sidx = sidx;
	}

	public String getSearch() {
		return search;
	}

	public void setSearch(String search) {
		this.search = search;
	}
}
